<?php


class Reason {
    private static $failsTable = 'views_fails';
    
    public $id      = 0;
    public $trc_id  = 0;
    public $to_date = '';
    public $reason  = '';
    public $manual_value  = '';
    
    private $data = array();
    public $error = '';

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }

    public function __get($name) {
        return Arr::getValue($this->data, $name);
    }


    public function __construct($array=array()) {
        $this->setFromArray($array);
        
    }



    public function setFromArray($array=array()) {
        if (!is_array($array)) return;
        foreach ($array as $key => $val) {
            $this->$key = $val;
        }
    }
    
    public function asArray() {
        $out = array();
        $fields = array_keys(get_class_vars(get_class($this)));
        
        foreach ($fields as $key) if (($key<>'data')&&($key<>'error')) $out[$key] = $this->$key;
        foreach ($this->data as $key) $out[$key] = $this->$key;
        
        return $out;
    }
    
    
    



    public static function getAll($days=32, $reset=false) {
        static $data;
        $days = (int)$days;
        if ($days < 1) $days = 32;

        if (!$reset && is_array($data)) return $data;

        $data = array();
        $res = DB::query("SELECT * FROM ".self::$failsTable." WHERE DATE(to_date) > DATE_SUB(CURDATE(), INTERVAL $days DAY) ORDER BY to_date, trc_id DESC");
        if (!$res || !DB::state()) return $data;

        while($row = mysqli_fetch_array($res, MYSQLI_ASSOC)){
            $id =  Arr::getValue($row, 'id', FALSE);
            if ($id) $data[$id] = $row;
        }

        return $data;
    }
    
    
    public static function getFilteredItems($trc_id, $dateFrom=false, $dateTo=false) {
        $J = new JSON();
        $trc_id = (int)$trc_id;
        
        
        if (!$trc_id) return $J->error ('Не указано отображение');
        $allViews = getAllViews();
        $v = Arr::getValue($allViews, $trc_id, false);
        if (!$v) return $J->error ('Отображение не найдено');
        $obj_name = Arr::getValue($v, 'obj_name', '???');
        $address = Arr::getValue($v, 'address', '???');
        
        $dateFrom = DateTime::createFromFormat('Y-m-d', $dateFrom);
        if (!$dateFrom) $dateFrom = DateTime::createFromFormat('Y-m-d', '2010-01-01');
        
        $dateTo = DateTime::createFromFormat('Y-m-d', $dateTo);
        if (!$dateTo) $dateTo = new DateTime('now');
        
        
        $df = $dateFrom->format('Y-m-d');
        $dt = $dateTo->format('Y-m-d');
        
        $res = DB::query("
            SELECT * 
            FROM ".self::$failsTable." 
            WHERE 
                trc_id = $trc_id
                AND DATE(to_date) >= DATE('$df')
                AND DATE(to_date) <= DATE('$dt')    
            ORDER BY to_date DESC
        ");
        if (!DB::$lastReqState) $J->error('Ошибка при выполнении запроса <!--('.DB::getError().')-->');
        
        $data = array('sorted' => array(), 'byId' => array());
        
        while($row = $res->fetch_assoc()){
            $id =  Arr::getValue($row, 'id', FALSE);
            $row['obj_name'] = $obj_name;
            $row['address'] = $address;
            $data['sorted'][] = $row;
            if ($id) $data['byId'][$id] = $row;
        }
        
        $J->items = $data;
        return $J;

    }

    public function save() {
        $J = new JSON();


        if (!$this->reason && is_null($this->manual_value)) return $J->error('Не указано значение');
        if ($this->reason && $this->manual_value) return $J->error('Указаны текст и значение, что недопустимо. Выберите что-то одно.');
        if (!$this->to_date) return $J->error('Не указана дата'); 
        if (!$this->trc_id) return $J->error('Не указан объект');


        $loader = getDataLoader($this->trc_id, $this->error);
        if (!$loader || !($loader instanceof Loader)) return $J->error('Ошибка в данных отображения');
        if (!$loader->state()) return $J->error($loader->getErrString());
        

        //Transaction start
        DB::$mysqli->autocommit(FALSE);

        //Обновление/вставка текста
        //Флаг режима "обновление/вставка" : $update = ($this->id > 0)
        if ($this->reason){
            if($this->id > 0){
                ////Обновление
                $q = "  UPDATE views_fails
                        SET
                            reason = '$this->reason',
                            manual_value = NULL
                        WHERE
                            id = $this->id";
            }
            else{
                ////Вставка
                $q = "  INSERT INTO views_fails
                                ( trc_id,           to_date,          manual_value,  reason      )
                        VALUES  ('$this->trc_id', '$this->to_date', NULL,         '$this->reason')";
            }

            $res = DB::query($q);
            if(!$res) $J->error("Ошибка при записи значения в базу данных");
            if (!$this->id) $this->id = DB::$mysqli->insert_id;

            if (!$J->getState()) {
                //Удаление из таблицы объекта
                $res = $loader->DeleteManualValue(array("to_date" => $this->to_date));
                if (!$res) $J->error("Ошибка в данных объекта");
            }

        }


        else if (!is_null($this->manual_value)){
            //Запись в obj_reason
            if($this->id > 0){
                ////Обновление
                $q = "  UPDATE views_fails
                        SET
                            reason = NULL,
                            manual_value = '$this->manual_value'
                        WHERE
                            id = $this->id";
            }
            else{
                ////Вставка
                $q = "  INSERT INTO views_fails
                                ( trc_id,          to_date,          manual_value,         reason )
                        VALUES  ('$this->trc_id', '$this->to_date', '$this->manual_value', NULL   )";
            }
            $res = DB::query($q);
            if(!$res) $J->error("Ошибка при записи значения в базу данных");
            if (!$this->id) $this->id = DB::$mysqli->insert_id;

            //Если запрос выполнился успешно
            if (!$this->error) {
                //Запись/обновление в таблице объекта
                $JL = $loader->InsertManualValue(array("to_date" => $this->to_date, "manual_value" => $this->manual_value));
                if (!($JL instanceof JSON) || !$JL->getState()) $J->error("Ошибка в данных объекта  ".$JL->getErrorString());
            }


        }

            if ($J->getState()) DB::$mysqli->commit();
            else DB::$mysqli->rollback();

            //Transaction end
            DB::$mysqli->autocommit(TRUE);
            return $J;
    }
}




?>